// ParseStructures.h

// Struktury vyuzivane pre parsovanie serverovych sprav

#ifndef PARSESTRUCTURES_H
#define PARSESTRUCTURES_H

#include "Common/World/Types.h"

#ifdef COACH
#	include "Common/World/Point.h"
#	include "Common/World/Vector.h"
#endif // COACH

// Agent z vizualnej informacie 
struct AGENT
{
	// Je platny cely tento zapis?
	bool valid;
	// Hracove cislo, 0 ak je nezname
	int uniformNumber;
	// Je hrac brankarom?
	bool goalie;
    // Vzdialenost k hracovi
	float dist;
	// Smer k hracovi (vzdy platny)
	float dir;
	// Je platna vzdialenost k hracovi?
	bool distValid;
	// Zmena vzdialenosti
	float distChange;
	// Zmena smeru
    float dirChange;
	// Su zmeny smeru a vzdialenosti platne?
	bool changesValid;
	// Smer tela
    float bodyFacingDir;
	// Smer hlavy
    float headFacingDir;
	// Su platne smery tela a hlavy?
	bool facingValid;	
	// Smer ukazujucej ruky hraca
	float armDir;
	// Validita ukazujucej ruky hraca
	bool armValid;
};

// Pocet poslanych alebo prijatych prikazov
struct COMMAND_COUNTS
{
	int kickCount;			
	int dashCount;			
	int turnCount;			
	int sayCount;			
	int turnNeckCount;		
	int catchCount;			
	int moveCount;			
	int changeViewCount;	
	int tackleCount;		
	int attentiontoCount;	
	int pointtoCount;		
};

// Ciara z vizualnej informacie
struct LINE
{
	// Vzdialnost od ciary
    float dist;
	// Smer k ciare
    float dir;
	// Typ ciary
    LineType type;
};

// Jedna vlajka z vizualnej informacie
struct LANDMARK
{
	// Je tento cely zapis platny?
	bool valid;
	// Vzdialenost vlajky
    float dist;
	// Smer k vlajke
    float dir;
    // Platnost vzdialenosti
	bool distValid;
    // Zmena vzdialenosti vlajky
	float distChange;
	// Zmena smeru k vlajke
    float dirChange;
	// Je platna vzdialenost a smer k vlajke?
	bool changesValid;
	// Typ vlajky
    FlagType type;
};

// Cela vizualna informacia
struct VISUAL_INFO
{
	int time;				// Simulacny cas zo servera

	int oursCnt;			// Pocet nasich spoluhracov vo VI
	AGENT ours[10];
	int theirCnt;			// Pocet superovych hracov vo VI
	AGENT their[11];
	int unknownCnt;			// Pocet neznamych hracov vo VI (prilis vzdialeni)
	AGENT unknown[21];
	int nearbyCnt;			// Pocet hracov vo VI (v okruhu 3 metrov)
	AGENT nearby[21];

	int lineCnt;			// Pocet ciar
	LINE lines[4];
	int landmarkCnt;		// Pocet zastavok
	LANDMARK landmarks[55];

	LANDMARK ball;
	int ballCnt;			// Ak 0 => informacie o lopte nie su platne
};

// Struktura o stave tela
struct SENSE_BODY
{
	int time;					// Simulacny cas zo servera

	float stamina;				//
	float effort;				//
	float speedSize;			//
	float speedDirection;		//
	float headAngle;			//
	
	// Pocet cyklov, kym skonci "tacke", 0 => nie je "tackling"
	int tackleExpires;

	// Zamerane na hracovu stranu
	bool focusedSide;
	// Cislo zameraneho hraca, 0 => nezamerane
	int focusedNumber;
	// Pocet cyklov, pokial sa znovu da hybat s ukazujucou rukou
	int armMovableAfter;
	// Pocet cyklov, pokial ruka prestane ukazovat
	int armExpires;
	// Vzdialenost ukazujucej ruky
	float armDistance;
	// Smer ukazujucej ruky
	float armDirection;

	ViewQuality viewQuality;	// Kvalita videnia
	ViewWidth viewWidth;		// Sirka videnia

	COMMAND_COUNTS counts;		//
};

// V PRIPADE KOUCA
#ifdef COACH
// Lopta vo vizualnych informaciach kouca
struct COACH_BALL
{
	// Absolutne suradnice lopty
	Point pos;
	// Rychlost lopty v smere (x,y) [metrov za cyklus]
	Vector speed;
};

// Hrac v koucovych vizualnych informaciach
struct COACH_PLAYER
{
    
    // Cislo hraca
	int uniformNumber;
    // Je hrac brankarom?
	bool goalie;
	// Absolutne suradnice hraca
	Point pos;
	// Rychlost hraca v smere (x,y) [metrov za cyklus]
	Vector speed;
	// Smer tela
    float bodyFacingDir;
	// Smer hlavy
    float headFacingDir;
};

// Cela vizualna informacie pre kouca
struct COACH_VISUAL_INFO
{
	int time;					// Simulacny cas zo servera

	int oursCount;				// Pocet nasich hracov
	COACH_PLAYER ours[11];
	int theirCount;				// Pocet superovych hracov
	COACH_PLAYER their[11];

	COACH_BALL ball;			// Lopta 
};
#endif // COACH


#endif // PARSESTRUCTURES_H
